package org.convallaria.framework.common.constants.sys;

/**
 * 用户相关常量
 * 
 * 功能特性：
 * - 定义用户状态常量
 * - 定义用户类型常量
 * - 定义性别常量
 * - 提供统一的常量管理
 * 
 * 设计原则：
 * - 所有常量都是public static final
 * - 使用final类防止继承
 * - 私有构造函数防止实例化
 * - 按功能模块分组组织
 * 
 * @author convallaria
 * @since 1.0.0
 */
public final class UserConstants {

    private UserConstants() {
        // 防止实例化
    }

    // ==================== 用户状态常量 ====================

    /**
     * 用户正常状态
     */
    public static final String USER_STATUS_NORMAL = "0";

    /**
     * 用户停用状态
     */
    public static final String USER_STATUS_DISABLED = "1";

    // ==================== 用户类型常量 ====================

    /**
     * 系统用户
     */
    public static final String USER_TYPE_SYSTEM = "00";

    /**
     * 外部用户
     */
    public static final String USER_TYPE_EXTERNAL = "01";

    /**
     * API用户
     */
    public static final String USER_TYPE_API = "02";

    // ==================== 性别常量 ====================

    /**
     * 男性
     */
    public static final String USER_SEX_MALE = "0";

    /**
     * 女性
     */
    public static final String USER_SEX_FEMALE = "1";

    /**
     * 未知性别
     */
    public static final String USER_SEX_UNKNOWN = "2";

    // ==================== 用户字段长度限制 ====================

    /**
     * 用户名最小长度
     */
    public static final int USER_NAME_MIN_LENGTH = 3;

    /**
     * 用户名最大长度
     */
    public static final int USER_NAME_MAX_LENGTH = 30;

    /**
     * 昵称最大长度
     */
    public static final int NICK_NAME_MAX_LENGTH = 30;

    /**
     * 邮箱最大长度
     */
    public static final int EMAIL_MAX_LENGTH = 50;

    /**
     * 手机号长度
     */
    public static final int PHONE_NUMBER_LENGTH = 11;

    /**
     * 密码最小长度
     */
    public static final int PASSWORD_MIN_LENGTH = 6;

    /**
     * 密码最大长度
     */
    public static final int PASSWORD_MAX_LENGTH = 20;

    /**
     * 头像URL最大长度
     */
    public static final int AVATAR_MAX_LENGTH = 100;

    /**
     * 备注最大长度
     */
    public static final int REMARK_MAX_LENGTH = 500;

    // ==================== 用户状态描述 ====================

    /**
     * 用户状态描述映射
     */
    public static final String[] USER_STATUS_DESCRIPTIONS = {
        "正常", "停用"
    };

    /**
     * 用户类型描述映射
     */
    public static final String[] USER_TYPE_DESCRIPTIONS = {
        "系统用户", "外部用户", "API用户"
    };

    /**
     * 性别描述映射
     */
    public static final String[] USER_SEX_DESCRIPTIONS = {
        "男", "女", "未知"
    };

    // ==================== 正则表达式常量 ====================

    /**
     * 用户名正则表达式（字母、数字、下划线）
     */
    public static final String USER_NAME_PATTERN = "^[a-zA-Z0-9_]+$";

    /**
     * 邮箱正则表达式
     */
    public static final String EMAIL_PATTERN = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$";

    /**
     * 中国大陆手机号正则表达式
     */
    public static final String PHONE_NUMBER_PATTERN = "^1[3-9]\\d{9}$";

    /**
     * 密码正则表达式（字母、数字、特殊字符）
     */
    public static final String PASSWORD_PATTERN = "^(?=.*[a-zA-Z])(?=.*\\d)[a-zA-Z\\d@$!%*?&]{6,20}$";

    // ==================== 默认值常量 ====================

    /**
     * 默认用户类型
     */
    public static final String DEFAULT_USER_TYPE = USER_TYPE_SYSTEM;

    /**
     * 默认用户状态
     */
    public static final String DEFAULT_USER_STATUS = USER_STATUS_NORMAL;

    /**
     * 默认性别
     */
    public static final String DEFAULT_USER_SEX = USER_SEX_UNKNOWN;

    /**
     * 默认头像
     */
    public static final String DEFAULT_AVATAR = "/static/images/default-avatar.png";

    // ==================== 业务规则常量 ====================

    /**
     * 最大登录失败次数
     */
    public static final int MAX_LOGIN_FAIL_COUNT = 5;

    /**
     * 账户锁定时间（分钟）
     */
    public static final int ACCOUNT_LOCK_TIME_MINUTES = 30;

    /**
     * 密码过期时间（天）
     */
    public static final int PASSWORD_EXPIRE_DAYS = 90;

    /**
     * 会话超时时间（分钟）
     */
    public static final int SESSION_TIMEOUT_MINUTES = 30;

    // ==================== 工具方法 ====================

    /**
     * 获取用户状态描述
     * 
     * @param status 状态值
     * @return 状态描述
     */
    public static String getUserStatusDesc(String status) {
        if (USER_STATUS_NORMAL.equals(status)) {
            return USER_STATUS_DESCRIPTIONS[0];
        } else if (USER_STATUS_DISABLED.equals(status)) {
            return USER_STATUS_DESCRIPTIONS[1];
        }
        return "未知";
    }

    /**
     * 获取用户类型描述
     * 
     * @param userType 用户类型
     * @return 用户类型描述
     */
    public static String getUserTypeDesc(String userType) {
        if (USER_TYPE_SYSTEM.equals(userType)) {
            return USER_TYPE_DESCRIPTIONS[0];
        } else if (USER_TYPE_EXTERNAL.equals(userType)) {
            return USER_TYPE_DESCRIPTIONS[1];
        } else if (USER_TYPE_API.equals(userType)) {
            return USER_TYPE_DESCRIPTIONS[2];
        }
        return "未知";
    }

    /**
     * 获取性别描述
     * 
     * @param sex 性别值
     * @return 性别描述
     */
    public static String getUserSexDesc(String sex) {
        if (USER_SEX_MALE.equals(sex)) {
            return USER_SEX_DESCRIPTIONS[0];
        } else if (USER_SEX_FEMALE.equals(sex)) {
            return USER_SEX_DESCRIPTIONS[1];
        } else if (USER_SEX_UNKNOWN.equals(sex)) {
            return USER_SEX_DESCRIPTIONS[2];
        }
        return "未知";
    }

    /**
     * 验证用户状态是否有效
     * 
     * @param status 状态值
     * @return true=有效，false=无效
     */
    public static boolean isValidUserStatus(String status) {
        return USER_STATUS_NORMAL.equals(status) || USER_STATUS_DISABLED.equals(status);
    }

    /**
     * 验证用户类型是否有效
     * 
     * @param userType 用户类型
     * @return true=有效，false=无效
     */
    public static boolean isValidUserType(String userType) {
        return USER_TYPE_SYSTEM.equals(userType) 
            || USER_TYPE_EXTERNAL.equals(userType) 
            || USER_TYPE_API.equals(userType);
    }

    /**
     * 验证性别是否有效
     * 
     * @param sex 性别值
     * @return true=有效，false=无效
     */
    public static boolean isValidUserSex(String sex) {
        return USER_SEX_MALE.equals(sex) 
            || USER_SEX_FEMALE.equals(sex) 
            || USER_SEX_UNKNOWN.equals(sex);
    }
}
